import { Component } from 'vue'
import { Widget } from '../models'
import { WidgetStyle, GetWidgetComponent } from './widget'
import { WidgetData } from './WidgetData'
import { WidgetType } from './WidgetType'
import { RawField } from './RawField'
import { TextData } from './text'

/** 控件选项 */
export interface WidgetOption {
  /** 控件名 - 英文 */
  key: string

  /** 控件名称 - 展示 */
  name: string

  /** 控件类型 */
  type: WidgetType

  /** 控件风格 */
  style: WidgetStyle

  /** 控件图标 */
  icon: string

  /** 控件初始宽度 */
  width: number

  /** 控件初始高度 */
  height: number

  /** 控件最小宽度 */
  minWidth?: number

  /** 控件最小高度 */
  minHeight?: number

  /** 控件最大宽度 */
  maxWidth?: number

  /** 控件最大高度 */
  maxHeight?: number

  /** 默认配置 */
  default?: Record<string, unknown>

  /** 控件是否允许调整大小，默认 `false` */
  resizable?: boolean | ((widget: Widget) => boolean | void)

  /** 是否以中心点位置调整大小 */
  resizeAtCenter?: boolean

  /** 控件组件 */
  component?: Component | GetWidgetComponent

  /** 控件组件扩展 */
  componentExtend?: Component

  /** 控件设置组件 */
  settingComponent?: Component

  /** 控件填写组件 */
  fillingComponent?: Component

  /** 控件设置是否自定义填写要求 */
  settingCustomFillRequirements?: boolean

  /** 文本控件数据 */
  text?: Partial<TextData>

  /** 控件初始方法 */
  init?: (widget: Widget, data: WidgetData) => void

  /** 控件设置校验 */
  settingValidate?: (widget: Widget) => string | void

  /** 控件使用校验 */
  usingValidate?: (widget: Widget) => string | void

  /** 检测控件是否有填写值 */
  hasFillValue?: (widget: Widget) => boolean

  /** 清除控件数据 */
  clear?: (widget: Widget) => void

  /** 根据原始控件数据创建控件扩展 */
  rawWidgetCreator?: (widgetData: WidgetData, data: RawField) => WidgetData | void

  /** 根据控件获取原始控件数据扩展 */
  rawFieldGetter?: (widget: Widget, data: RawField) => RawField | void

  /** 控件 label 次级提示 */
  labelTips?: (widget: Widget) => string | void

  // eslint-disable-next-line
  [key: string]: any
}
